from ftplib import FTP
import sys
import os
import time
import subprocess
from dacid_dht import Dht

#dhtsunucu=None # 10.45.2.127:1923
dhtsunucu="10.45.2.129:1923"
raporlama_dizin="/tmp/raporlama/"

subprocess.call(['mkdir',"-p",raporlama_dizin])

def get_interface():
	for index, item in enumerate(os.listdir("/sys/class/net")):
		if "wg" in item:
			return item
			
f = os.popen('ifconfig '+get_interface()+' | grep "inet\ addr" | cut -d: -f2 | cut -d" " -f1')
HOST=f.read().strip('\n')

def getFile(ftp, fname):
    try:
        filename=raporlama_dizin+fname
        bfile = os.path.basename(fname)
        ftp.retrbinary("RETR " + bfile ,open(filename, 'wb').write)
        print ("Success:",filename,"got")
        return True
    except:
        print ("Error:",filename,"cant get")
        os.remove(filename)
    return False

def upload(ftp, ifile):
    bfile = os.path.basename(ifile)
    ext = os.path.splitext(ifile)[1]
    if ext in (".txt", ".htm", ".html"):
        ftp.storlines("STOR " + bfile, open(ifile))
    else:
        ftp.storbinary("STOR " + bfile, open(ifile, "rb"), 1024)


#dht den gelen bilgilerle host,port,servis kanalı belirlenecek
dht=Dht(bs=dhtsunucu)
sunucular=dht.sunucular()
print (sunucular)

if sunucular:
	for sunucu in sunucular:
		shost=sunucu.split(":")[0]
		sport=int(sunucu.split(":")[1])
		ftp = FTP()
		ftp.connect(shost,sport)
		ftp.login()
		id=ftp.getmultiline()

		print (ftp.getwelcome(),"sunucusuna hoşgeldiniz")
		print("istemci id:",id)

		# sunucuda tanımlı servisler çekilir
		#ftp.retrlines('LIST')
		#print ("servisler:","\n",servisler)
		service_1="port-tarama/"
		try:	
			ftp.cwd(service_1+id)
		except Exception as e:  
			print (service_1,str(e))
			# break process for this server loop
			print (service_1," işlemi gerçekleştirilemedi.")
			continue
		#getFile(ftp,'help')

		data = []
		 
		ftp.dir(data.append)

		#eski istek/rapor sil
		subprocess.call(['rm',"-rf",raporlama_dizin+"istek",raporlama_dizin+"rapor"])
		
		# port tarama için client kendi host bilgisini göndermektedir. Başka bir ip de sorgulatabilir.
		istek_icerik=str.encode(HOST)
		istek_dosya=raporlama_dizin+"istek"
		open(istek_dosya, 'wb').write(istek_icerik)
		
		# istek dosyası ftp sunucusuna yüklenir.
		upload(ftp,istek_dosya)

		while(True):
			ftp.dir(data.append)
			if getFile(ftp,'rapor'):
				break
			else:
				time.sleep(3)
		 
		ftp.quit()
else:
	print("aktif sunucu bulunamadı.")

